package 链表;

/* https://leetcode-cn.com/problems/merge-in-between-linked-lists/ */

public class _1669_合并两个链表 {

    public class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
    public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2){
        // 定义a_cur，指向a当前节点
        ListNode a_cur = list1;
        // 定义b_cur,指向b当前节点
        ListNode b_cur = list1;
        // 定义cur2，使cur2指向list2的最后的节点
        ListNode cur2 = list2;

        // 使cur2指向list2的最后的节点
        while (cur2 != null && cur2.next != null){
            cur2 = cur2.next;
        }
        // 让a_cur停在value等于a的节点前（由于测试的链表元素是由小到大依次+1的即[0,1,2,3,4]这样的链表，所以可以投机取巧用for遍历到a前）
        for (int i = 0;i<a-1;i++){
            a_cur = a_cur.next;
        }
        // 让b_cur停在value等于b的节点之后
        for (int i = 0;i<b+1;i++){
            b_cur = b_cur.next;
        }
        // 让a_cur指向list2的head
        a_cur.next = list2;

        // 让list2的最后一个节点的next指向b_cur
        cur2.next = b_cur;

        return list1;
    }
}
